package com.ssy.lingxi.product.service;

import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.model.vo.PageVO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.product.api.model.request.*;
import com.ssy.lingxi.product.api.model.response.GoodsAndProcessResponse;
import com.ssy.lingxi.product.api.model.response.GoodsResponse;
import com.ssy.lingxi.product.api.model.response.GoodsSourceResponse;
import com.ssy.lingxi.product.api.model.response.GoodsSubResponse;
import com.ssy.lingxi.product.api.model.response.commodity.GoodsIdAndFirstCategoryIdResponse;
import com.ssy.lingxi.product.entity.Goods;
import com.ssy.lingxi.product.entity.GoodsSupplyList;
import com.ssy.lingxi.product.model.request.MaterialExamineRequest;
import com.ssy.lingxi.product.model.resp.MaterInnerLogResponse;
import com.ssy.lingxi.product.model.resp.MaterialInnerStatusResponse;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * 货品管理类
 *
 * @author jw.chen
 * @version 2.0.0
 * @date 2020/6/22
 */
public interface IGoodsService {

    /**
     * 物料管理-物料查询-列表
     *
     * @return 操作结果
     */
    List<MaterialInnerStatusResponse> getInnerStatus();

    /**
     * 物料管理-物料查询-详情-内部单据流转记录
     *
     * @param goodsId 物料id
     * @return 操作结果
     */
    List<MaterInnerLogResponse> getMaterInnerLogList(Long goodsId);

    /**
     * 物料管理-物料查询-列表
     *
     * @param sysUser           当前登录用户
     * @param pageVO            分页实体
     * @param goodsQueryRequest 货品查询类
     * @return 操作结果
     */
    Page<Goods> getMaterialList(UserLoginCacheDTO sysUser, PageVO pageVO, GoodsQueryRequest goodsQueryRequest);

    /**
     * 冻结物料
     *
     * @param sysUser                  当前登录用户
     * @param goodsFreezeEnableRequest 请求参数
     * @return 操作结果
     */
    String freezeGoods(UserLoginCacheDTO sysUser, GoodsFreezeEnableRequest goodsFreezeEnableRequest);

    /**
     * 启用物料
     *
     * @param sysUser                  当前登录用户
     * @param goodsFreezeEnableRequest 请求参数
     * @return 操作结果
     */
    String enableGoods(UserLoginCacheDTO sysUser, GoodsFreezeEnableRequest goodsFreezeEnableRequest);

    /**
     * 批量冻结物料
     *
     * @param sysUser                       当前登录用户
     * @param goodsFreezeEnableBatchRequest 请求参数
     * @return 操作结果
     */
    String freezeGoodsBatch(UserLoginCacheDTO sysUser, GoodsFreezeEnableBatchRequest goodsFreezeEnableBatchRequest);

    /**
     * 批量启用物料
     *
     * @param sysUser                       当前登录用户
     * @param goodsFreezeEnableBatchRequest 请求参数
     * @return 操作结果
     */
    String enableGoodsBatch(UserLoginCacheDTO sysUser, GoodsFreezeEnableBatchRequest goodsFreezeEnableBatchRequest);

    /**
     * 物料管理-物料查询-物料清单-列表
     *
     * @param request 请求参数
     * @return 操作结果
     */
    List<GoodsSupplyList> getGoodsSourceList(SimpleIdRequest request);

    /**
     * 物料管理-物料查询-物料清单-提交保存
     *
     * @param request 请求参数
     * @return 操作结果
     */
    String submitGoodsSourceList(GoodsSupplyRequest request);

    /**
     * 查询货品列表
     *
     * @param pageVO            分页实体
     * @param goodsQueryRequest 货品查询类
     * @return 操作结果
     */
    Page<Goods> getGoodsList(UserLoginCacheDTO sysUser, PageVO pageVO, GoodsQueryRequest goodsQueryRequest);

    /**
     * 查询待新增物料列表
     *
     * @param pageVO            分页实体
     * @param goodsQueryRequest 货品查询类
     * @return 操作结果
     */
    Page<Goods> getToBeAddGoodsList(UserLoginCacheDTO sysUser, PageVO pageVO, GoodsQueryRequest goodsQueryRequest);

    /**
     * 物料管理-查询货品列表(内部状态不为冻结)
     *
     * @param sysUser           当前登录用户
     * @param pageVO            分页实体
     * @param goodsQueryRequest 货品查询类
     * @return 操作结果
     */
    Page<Goods> getDoesNotFreezeGoodsList(UserLoginCacheDTO sysUser, PageVO pageVO, GoodsQueryRequest goodsQueryRequest);

    /**
     * 查询下级供应商货品列表
     *
     * @param sysUser                当前登录用户
     * @param pageVO                 分页实体
     * @param goodsQueryBySubRequest 货品查询类
     * @return 操作结果
     */
    Page<Goods> getSubGoodsList(UserLoginCacheDTO sysUser, PageVO pageVO, GoodsQueryBySubRequest goodsQueryBySubRequest);

    /**
     * 查询货品列表
     *
     * @param pageVO 分页实体
     * @param name   货品名称/货号/品牌名称
     * @return 操作结果
     */
    Page<Goods> getAppGoodsList(UserLoginCacheDTO sysUser, PageVO pageVO, String name);

    /**
     * 查询货品
     *
     * @param goodsId 货品id
     * @return Wrapper<?>
     */
    Goods getGoods(UserLoginCacheDTO sysUser, Long goodsId);

    /**
     * 添加/修改货品
     *
     * @param goodsRequest 请求参数
     * @return 操作结果
     */
    String saveOrUpdateGoods(UserLoginCacheDTO sysUser, GoodsRequest goodsRequest);

    /**
     * 批量删除货品
     *
     * @param idList 请求参数
     * @return 操作结果
     */
    String deleteBatchGoods(UserLoginCacheDTO sysUser, List<Long> idList);

    /**
     * 通过id查询一级品类id
     *
     * @param idList 请求参数
     * @return 操作结果
     */
    List<GoodsIdAndFirstCategoryIdResponse> getGoodsFirstCategoryIdList(List<Long> idList);

    /**
     * 物料管理-待新增物料-提交审核物料单
     *
     * @param request 请求参数
     * @param sysUser 当前登录用户
     * @return 操作结果
     */
    Wrapper<Void> goodsSubmit(SimpleIdRequest request, UserLoginCacheDTO sysUser);

    /**
     * 物料管理-待审核物料(一级)-列表
     *
     * @param sysUser           当前登录用户
     * @param pageVO            分页参数
     * @param goodsQueryRequest 请求参数
     * @return 操作结果
     */
    Page<Goods> goodsExamineList1(UserLoginCacheDTO sysUser, PageVO pageVO, GoodsQueryRequest goodsQueryRequest);

    /**
     * 物料管理-待审核物料(一级)-审核
     *
     * @param sysUser 当前登录用户
     * @param request 请求参数
     * @return 操作结果
     */
    Wrapper<Void> goodsExamine1(UserLoginCacheDTO sysUser, MaterialExamineRequest request);

    /**
     * 物料管理-待审核物料(一级)-批量审核通过
     *
     * @param sysUser 当前登录用户
     * @param request 请求参数
     * @return 操作结果
     */
    Wrapper<Void> goodsExamineBatch1(UserLoginCacheDTO sysUser, SimpleIdListRequest request);

    /**
     * 物料管理-待审核物料(二级)-列表
     *
     * @param sysUser           当前登录用户
     * @param pageVO            分页参数
     * @param goodsQueryRequest 请求参数
     * @return 操作结果
     */
    Page<Goods> goodsExamineList2(UserLoginCacheDTO sysUser, PageVO pageVO, GoodsQueryRequest goodsQueryRequest);

    /**
     * 物料管理-待审核物料(二级)-审核
     *
     * @param sysUser 当前登录用户
     * @param request 请求参数
     * @return 操作结果
     */
    Wrapper<Void> goodsExamine2(UserLoginCacheDTO sysUser, MaterialExamineRequest request);

    /**
     * 物料管理-待审核物料(二级)-批量审核通过
     *
     * @param sysUser 当前登录用户
     * @param request 请求参数
     * @return 操作结果
     */
    Wrapper<Void> goodsExamineBatch2(UserLoginCacheDTO sysUser, SimpleIdListRequest request);

    /**
     * 物料管理-待审核物料变更(一级)-列表
     *
     * @param sysUser           当前登录用户
     * @param pageVO            分页参数
     * @param goodsQueryRequest 请求参数
     * @return 操作结果
     */
    Page<Goods> goodsExamineChangeList1(UserLoginCacheDTO sysUser, PageVO pageVO, GoodsQueryRequest goodsQueryRequest);

    /**
     * 物料管理-待审核物料变更(一级)-审核
     *
     * @param sysUser 当前登录用户
     * @param request 请求参数
     * @return 操作结果
     */
    Wrapper<Void> goodsExamineChange1(UserLoginCacheDTO sysUser, MaterialExamineRequest request);

    /**
     * 物料管理-待审核物料变更(一级)-批量审核通过
     *
     * @param sysUser 当前登录用户
     * @param request 请求参数
     * @return 操作结果
     */
    Wrapper<Void> goodsExamineChangeBatch1(UserLoginCacheDTO sysUser, SimpleIdListRequest request);

    /**
     * 物料管理-待审核物料变更(二级)-列表
     *
     * @param sysUser           当前登录用户
     * @param pageVO            分页参数
     * @param goodsQueryRequest 请求参数
     * @return 操作结果
     */
    Page<Goods> goodsExamineChangeList2(UserLoginCacheDTO sysUser, PageVO pageVO, GoodsQueryRequest goodsQueryRequest);

    /**
     * 物料管理-待审核物料变更(二级)-审核
     *
     * @param sysUser 当前登录用户
     * @param request 请求参数
     * @return 操作结果
     */
    Wrapper<Void> goodsExamineChange2(UserLoginCacheDTO sysUser, MaterialExamineRequest request);

    /**
     * 物料管理-待审核物料变更(二级)-批量审核通过
     *
     * @param sysUser 当前登录用户
     * @param request 请求参数
     * @return 操作结果
     */
    Wrapper<Void> goodsExamineChangeBatch2(UserLoginCacheDTO sysUser, SimpleIdListRequest request);

    /**
     * 封装GoodsSubResponse物料属性
     *
     * @param resultList 数据
     */
    void encapsulatedGoodsSubResponseData(List<GoodsSubResponse> resultList);

    /**
     * 封装GoodsResponse物料属性
     *
     * @param resultList 数据
     */
    void encapsulatedGoodsResponseData(List<GoodsResponse> resultList);

    /**
     * 物料管理-查询货品列表(同时返回生产厂家和产地)
     *
     * @param pageVO                  分页实体
     * @param goodsSourceQueryRequest 货品查询类
     * @return 操作结果
     */
    PageData<GoodsSourceResponse> getGoodsByMemberList(PageVO pageVO, UserLoginCacheDTO sysUser, GoodsSourceQueryRequest goodsSourceQueryRequest);

    /**
     * 设置生产厂家和产地
     *
     * @param resultList 数据
     */
    void setGoodsResponseData(List<GoodsResponse> resultList, List<Goods> goodsList, UserLoginCacheDTO sysUser);

    /**
     * 获取工作流信息
     *
     * @param goods         货品信息
     * @param goodsResponse 响应数据
     * @param sysUser       当前登录用户
     */
    void getProcessInfo(Goods goods, UserLoginCacheDTO sysUser, GoodsAndProcessResponse goodsResponse);
}
